import getLastEvent from '../utils/getLastEvent'
import getSelector from '../utils/getSelector'
import tracker from '../utils/tracker';

function getLines(stack) {
    return stack.split('\n').slice(1).map(item => item.replace(/^\s+at\s+/g, "")).join('^');
}

export const injectJsError = () => {
    // 1.监听全局未捕获的js错误
    window.addEventListener('error', event =>{//错误事件对象
        let lastEvent = getLastEvent();//最后一个交互事件
        // 这是一个脚本加载错误
        if(event.target && (event.target.src || event.target.href)){
            tracker.send({
                kind: 'stability',//监控指标的大类,
                type: 'error',//小类型 这是一个错误
                errorType: 'resourceError',//JS或css资源加载错误
                message: event.target.outerHTML,//报错信息
                filename: event.target.src,//哪个文件报错了
                selector: lastEvent ? lastEvent.target.className : '',//代表最后一个操作的元素
            });
        }else{
            tracker.send({
                kind: 'stability',//监控指标的大类,
                type: 'error',//小类型 这是一个错误
                errorType: 'jsError',//JS执行错误
                message: event.message,//报错信息
                filename: event.filename,//哪个文件报错了
                position: `${event.lineno}:${event.colno}`,
                stack: getLines(event.error.stack),
                selector: lastEvent ? lastEvent.target.className : '',//代表最后一个操作的元素
            });
        }
    }, true)

    // 2.监听promise错误
    window.addEventListener('unhandledrejection', (event) => {
        // console.log(event);
        let lastEvent = getLastEvent();
        let message;
        let filename;
        let line = 0;
        let column = 0;
        let stack = '';
        let reason = event.reason;
        if(typeof event.reason === 'string'){
            message = reason;
        }else if(typeof event.reason === 'object'){//说明是一个错误对象
            if(reason.stack){
                let matchResult = reason.stack.match(/at\s+(.+):(\d+):(\d+)/);
                filename = matchResult[1];
                line = matchResult[2];
                column = matchResult[3];
            }
            message = reason.message;
            stack = getLines(reason.stack);
        }
        let data = {
            kind: 'stability',//监控指标的大类,
            type: 'error',//小类型 这是一个错误
            errorType: 'promiseError',//promise执行错误
            message,//报错信息
            filename: filename,//哪个文件报错了
            position: `${line}:${column}`,
            stack,
            selector: lastEvent ? lastEvent.target.className : '',//代表最后一个操作的元素
        }
        // console.log('log', log)
        tracker.send(data);
    })
    
};